<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	<script type="text/javascript">
		/*
			原型：当我们创建一个函数，都会有一个prototype属性，这个属性叫原型对象，其中包含了所以实例对象的共享的属性和方法

				prototype:显示原型 所有函数都有
				__proto__:隐式原型 所有对象都有

			函数是可以被调用的对象，所有有prototype和__proto__两个

			__proto__指向的是父元素的prototype

			__proto__的作用是：当你访问同一个对象的属性/方法的时候，如果这个对象中不存在这个属性，那么就会去他的__proto__所指向的那个对象（父元素的prototype）里去找，如果父元素也不存在这个属性，则继续往上找，直到顶端null，这就是原想链

		*/
		// let arr = new Array()
		let arr1 = [1,2,3,4]
		let arr2 = [4,5,6]
		Array.prototype.sun = function() {
			return this
		}
		// Array.prototype.head = "孙悟空"
		Object.prototype.head = "白骨精"
		console.log(arr1.prototype, arr1.__proto__, Array.prototype)//arr1.__proto__ == Array.prototype
		console.log(arr1.sun())
		console.log(arr2.head)

		function Box(width, height) {
			//私有
			this.widths = width
			this.heights = height
			this.c = function() {
				return (this.widths + this.heights) * 2
			}
		}

		//通过原型添加共享 属性和方法 公共
		Box.prototype.name = "盒模型"
		Box.prototype.s =function() {
			return this.widths * this.heights
		}

		let box1 = new Box(100, 200)
		let box2 = new Box(100, 200)
		console.log(box1.c())
		console.log(box2.s())
		//拿的是同一个s  原型的好处是 不会有额外的内存，所有属性和方法都是从原型继承下来的
		console.log(box1.s == box2.s)//true
		// c是私有的，每次去实例化(new)的时候都会重新创建，所有每个c的存储地址也不一样
		console.log(box1.c == box2.c)//false
		//对象的__proto__指向父级的prototype
		console.log(box1.__proto__ == Box.prototype)//true
	</script>
</body>
</html>